package com.bbva.aop;

import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.bbva.persistencia.generica.exception.BadUpdateException;
import com.bbva.persistencia.generica.exception.NotFoundException;
import com.bbva.persistencia.generica.modelo.TbEspejo;
import com.bbva.persistencia.generica.util.Busqueda;


public class MirrorDaoImpl<K,T> extends HibernateDaoSupport implements MirrorDao<K,T>{

	public  K insertar(K objeto) throws BadUpdateException{
		TbEspejo entidad = new TbEspejo();
		BigDecimal idEspejo = new BigDecimal(44);
		entidad.setIdEspejo(idEspejo);
		entidad.setDatatoda(objeto.toString());
		entidad.setInstancia(objeto.getClass().getName());
		getHibernateTemplate().persist(entidad);
		 System.out.println("> En el insertar: "+entidad.toString());
		return objeto;
	}


	@Override
	public K modificar(K objeto) {
	/*	 Busqueda filtro = Busqueda.forClass(TbEspejo.class)
		                 .add(Expression.like("thead", "%" + slogfilter.getsThread()+ "%"))
		    List<TbEspejo> lstEntidadRetorno = (List<TbEspejo>) buscarDinamico(filtro);
		for (TbEspejo entidad2 : lstEntidadRetorno) {
			System.out.println("> Resultado de buscarAllTest Key: "+entidad2.getIdEspejo() + " Value : " + entidad2.getInstancia());
			
		}*/
		TbEspejo entidad = new TbEspejo();
		BigDecimal idEspejo = new BigDecimal(objeto.hashCode());
		entidad.setIdEspejo(idEspejo);
		entidad.setDatatoda(objeto.toString());
		entidad.setInstancia(objeto.getClass().getName());
		getHibernateTemplate().update(entidad);
		 System.out.println("> En el modificar: "+entidad.toString());
		return objeto;
	}
	@Override
	public K eliminar(K objeto) {
		TbEspejo entidad = new TbEspejo();
		System.out.println("objeto.hashCode( : " +objeto.hashCode());
		BigDecimal idEspejo = new BigDecimal(objeto.hashCode());
		entidad.setIdEspejo(idEspejo);
		entidad.setDatatoda(objeto.toString());
		getHibernateTemplate().delete(getHibernateTemplate().contains(entidad) ? objeto : getHibernateTemplate().merge(entidad));
		
		 System.out.println("> En el eliminar: "+objeto.toString());
			return objeto;
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	public  List<K> buscarDinamico(final Busqueda filtro) throws NotFoundException{
		   return (List<K>)this.getHibernateTemplate().execute(new HibernateCallback() {
	           @Override
	            public Object  doInHibernate(Session session) throws HibernateException, SQLException {
	                Criteria busqueda = filtro.getExecutableCriteria(session);
	                busqueda.setFirstResult(((Busqueda)filtro).getFirstResult());
	                if (filtro.getMaxResults() > 0)
	                    busqueda.setMaxResults(((Busqueda)filtro).getMaxResults());
	                return (List<K>)busqueda.list(); 
	            }
	        });
	}

}
